/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemploadicionararboles;

import ejemploadicionararboles.exceptions.NonexistentEntityException;
import ejemploadicionararboles.exceptions.PreexistingEntityException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.swing.JOptionPane;
import model.Person;
import model.Persona;
import persistencia.PersonaJpaController;

/**
 *
 * @author DANIELA SANA
 */
public class EjemploAdicionarArboles extends Application {

    
    Stage stage;
    TreeView<Persona> treeView;
    Label labelSelectedItem,labelErrorText;
    Persona persona;
    Persona personaEditar;
    TextField inputNewItem;
    Button buttonNewItem;
    VBox centerPane;
    Node nodePersona;
    PersonaJpaController pc;

    public EjemploAdicionarArboles() {
        
        EntityManagerFactory emf =  Persistence.createEntityManagerFactory("EjemploAdicionarArbolesPU");
        pc = new PersonaJpaController(emf);
    }
    
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    private TextField txtFldNombre;
    private TextField txtFldApellido;
    
    @Override
    public void start(Stage primaryStage) {
        
        initComponents();
        stage = primaryStage;
        stage.setTitle("Demo of TreeView");
  
        BorderPane mainPane = new BorderPane();
  
        mainPane.setLeft(treeView);
  
        centerPane = new VBox();
        centerPane.setSpacing(3);
        centerPane.setPadding(new Insets(3));
        centerPane.getChildren().add(labelSelectedItem);
        nodePersona = contruirGUI();
        centerPane.getChildren().add(nodePersona);
        centerPane.getChildren().add(buttonNewItem);
        mainPane.setCenter(centerPane);
  
        Scene scene = new Scene(mainPane, 600, 400);
  
        stage.setScene(scene);
        stage.sizeToScene();
        stage.show(); 
    }
    
    
    /** Create and setup all the components used in this demo. */
 private void initComponents(){
     
  Persona personaRaiz = new Persona("Nodo", "Raiz");
  
  persistirPersona(personaRaiz);
  
  TreeItem<Persona> rootItem = new TreeItem<Persona>(personaRaiz);
  rootItem.setExpanded(true);
  treeView = new TreeView<Persona>(rootItem);
  treeView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
  treeView.getSelectionModel().selectedItemProperty().addListener( new ListenerSeleccionArbol() );
  treeView.setCellFactory(new Callback<TreeView<Persona>, TreeCell<Persona>>() {

            @Override
            public TreeCell<Persona> call(TreeView<Persona> p) {
                
                return new LabelTreeCell();     
                       
                
            }
        });
  labelSelectedItem = new Label("Selected:");
  
  labelErrorText = new Label("Error: ");
  
  inputNewItem = new TextField();
  
  buttonNewItem = new Button("Insert item");
  buttonNewItem.setOnAction( new ManejadorClickBoton() );
 }

    private void persistirPersona(Persona persona) {
      
            try {
                pc.create(persona);
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(EjemploAdicionarArboles.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(EjemploAdicionarArboles.class.getName()).log(Level.SEVERE, null, ex);
            }
           
    }
    
    private void editarPersona(Persona persona){
        try {
            pc.edit(persona);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(EjemploAdicionarArboles.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(EjemploAdicionarArboles.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    private Persona sincronizarPersona(Persona persona){
        
        return pc.getEntityManager().merge(persona);
        
    }
 
 class ListenerSeleccionArbol implements ChangeListener<TreeItem<Persona>>{
     
        @Override
        public void changed(ObservableValue<? extends TreeItem<Persona>> ov, TreeItem<Persona> oldItem, TreeItem<Persona> newItem) {
            if(newItem != null){
                
            labelSelectedItem.setText("Seleccionado" + newItem.getValue().getNombres() + " " +newItem.getValue().getApellidos());
            
            
            }      
            
        }

             
 }
 
 class ManejadorClickBoton implements EventHandler< ActionEvent >{

        @Override
        public void handle(ActionEvent t) {
            TreeItem<Persona> selectedTreeItem = treeView.getSelectionModel().getSelectedItem();
            
           
            
            //persona = sincronizarPersona(persona);//trae el id correcto
            if(selectedTreeItem != null){
                 persona = new Persona(txtFldNombre.getText(), txtFldApellido.getText());
            
            persistirPersona(persona);
                selectedTreeItem.getChildren().add(new TreeItem<Persona>(persona)); 
                Persona personaPadre = selectedTreeItem.getValue();    
                //sincronizar con la base de datos
                personaPadre = sincronizarPersona(personaPadre);
                personaPadre.getHijos().add(persona);
                editarPersona(personaPadre);
                selectedTreeItem.setExpanded(true);
                
            } else {
                JOptionPane.showMessageDialog(null, "Seleccione el padre del nuevo objeto");
            }
        }

     
     
 }
 
 private class LabelTreeCell extends TreeCell<Persona>{

        @Override
        protected void updateItem(Persona person, boolean bln) {
            super.updateItem(person, bln);
            if(person != null ){
                
                setText(person.getNombres()+ " " +person.getApellidos());
               if(person.isEsmeralda()){
                   setGraphic(construirNodoEsmeralda());
               } else {
                   setGraphic(construirNodoDiamante());
               }
            }
        }

        private Node construirNodoEsmeralda() {
            Image image = new Image(EjemploAdicionarArboles.class.getResourceAsStream("/images/esmeralda.gif"));
            ImageView imgView = new ImageView(image);                
            return imgView;
        }

        private Node construirNodoDiamante() {
            Image image = new Image(EjemploAdicionarArboles.class.getResourceAsStream("/images/diamante.gif"));
            ImageView imgView = new ImageView(image);                
            return imgView;
        }
     
     
 }
 
 public Node contruirGUI(){
        
        if(persona == null){
            persona = new Persona("", "");        
        }
        
        GridPane gridPane = new GridPane();
        gridPane.setHgap(5);
        gridPane.setVgap(5);
        gridPane.setAlignment(Pos.CENTER);
        
        Label lblNombre = new Label("Nombre");
        Label lblApellido = new Label("Apellido");
        
        txtFldNombre = new TextField();
        txtFldApellido = new TextField();
        
        //txtFldNombre.textProperty().bindBidirectional( persona.firstNameProperty() );
        //txtFldApellido.textProperty().bindBidirectional( persona.lastNameProperty() );
        CheckBox chkBoxEsmeralda = new CheckBox( "Esmeralda ");
        //chkBoxEsmeralda.selectedProperty().bindBidirectional(persona.esmeraldaProperty());
//        Button button = new Button("Valores");
//        
//        button.setOnAction( new EventHandler<ActionEvent>() {
//
//            @Override
//            public void handle(ActionEvent t) {
//                System.out.println("Nombre Persona:" + persona.getFirstName());
//                System.out.println("Apellido Persona:" + persona.getLastName());
//            }
//        });
                
        gridPane.add(lblNombre, 1, 1);
        gridPane.add(txtFldNombre, 2, 1);
        gridPane.add(lblApellido, 1, 2);
        gridPane.add(txtFldApellido, 2,2);
        gridPane.add(chkBoxEsmeralda,1,3);
        //gridPane.add(button,2,3);
        
        return gridPane;     
        
    }    
 
}
